package com.yu.config.redis;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.RedisTemplate;

import java.io.EOFException;
import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Configuration
public class RedisValueTemplate<K,V> implements BaseRedis {

    private static Integer REDIS_MAX=50960;

    private static int getRandomInt(int num1,int num2){
        return num1+(int)(Math.random()*(num2-num1+1));
    }

    @Autowired
    private RedisTemplate<K,V> redisTemplate;

    /**
     * 存入string类型
     * @param k  key值
     * @param v  保存的对象
     */
    public void putString(K k,V v) throws IOException {
        if(getBytes(v).length>REDIS_MAX){
            throw new EOFException("存入对象的超过x4000个字节");
        }
        redisTemplate.opsForValue().set(k,v,getRandomInt(1,10), TimeUnit.MINUTES);
    }


    /**
     * 存入string类型
     * @param k  key值
     * @param v  保存的对象
     * @param l  时间值
     * @param timeUnit 时间类型
     */
    public void putString(K k, V v, long l, TimeUnit timeUnit) {
        if(getBytes(v).length>REDIS_MAX){
            try {
                throw new Exception("存入对象的超过x4000个字节");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        redisTemplate.opsForValue().set(k,v,l,timeUnit);
    }

    /**
     * 存入string类型
     * @param k  key值
     * @param v  保存的对象
     */
    public void putStringNoTTL(K k, V v) {
        if(getBytes(v).length>REDIS_MAX){
            try {
                throw new Exception("存入对象的超过x4000个字节");
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        redisTemplate.opsForValue().set(k,v);
    }

    /**
     * 通过key获取redis中的信息
     * @param k
     * @return
     */
    public V getString(K k) {
        return redisTemplate.opsForValue().get(k);
    }

    /**
     * 删除redis中的信息
     * @param k
     * @return
     */
    public Boolean removeString(K k){
        return redisTemplate.delete(k);
    }

    public Long getIncrement(K k){
        return redisTemplate.opsForValue().increment(k,1);
    }
}
